我們在前一天介紹了 Go 的 Array、Slices
今天要來介紹的是 Go 很重要的資料結構 - struct
我們可以使用 struct 來將一連串相關的資訊包裝起來,變成資料
像是 API Request、Response 等
而 struct 也是 Go 要實作物件導向很重要的一個要素
在這篇,我們先不會提到物件導向相關的東西,後面再來提~
在 Go 要宣告 struct 也很簡單,語法如下
// 語法
type <struct 名稱> struct {
<結構成員 1> <型別> <Tag>
<結構成員 2> <型別> <Tag>
...
<結構成員 n> <型別> <Tag>
}
實際範例如下
// Example
type Album struct {
Name string `json:"name"`
Singer string `json:"singer"`
ReleaseDate string `json:"releaseDate"`
Price float64 `json:"price"`
}
以上面的例子來說,我們宣告了一個叫做 Album 的 struct
其包含四個成員,分別如下
接下來就用這個 Album struct 來說明如何使用
package main
import "fmt"
type Album struct {
Name string `json:"name"`
Singer string `json:"singer"`
ReleaseDate string `json:"releaseDate"`
Price float64 `json:"price"`
}
func main() {
album := Album{
Name: "KILL MY DOUBT",
Singer: "ITZY",
ReleaseDate: "2023-07-31",
Price: 13400,
}
jsonData, err := json.Marshal(album)
if err != nil {
fmt.Println(err)
} else {
fmt.Println(string(jsonData))
}
}
輸出結果如下
{
"name": "KILL MY DOUBT",
"singer": "ITZY",
"releaseDate": "2023-07-31",
"price": 13400
}
我們在 5~10 行的地方,宣告了 Album struct
接著在 13~18 行的地方,宣告一個型別為 Album struct 的變數 album,並賦值給他
接著在 19~24 行,將其轉成 JSON 後印出
上面的宣告 (13~18 行),其實也可以改寫成下面這樣
不寫對應的結構成員名稱,Go 會自己去對應 (但我自己是習慣會寫啦)
album := Album{
"KILL MY DOUBT",
"ITZY",
"2023-07-31",
13400,
}
接下來要介紹的是在 struct A 中使用 struct B 來將欄位抽離的用法
雖然單看這句話,感覺會有點難理解用途,不如實際用一次就知道了
針對價格部分,我們多新增一些欄位
因為專輯可能會有很多版本,每個版本的價格都不盡相同
struct 定義好之後像下面這樣
type Price struct {
Version string `json:"version"`
Price float64 `json:"price"`
Unit string `json:"unit"`
}
接著將原先的 Price
欄位改成這邊新定義的 Price struct
type Album struct {
Name string `json:"name"`
Singer string `json:"singer"`
ReleaseDate string `json:"releaseDate"`
Price
}
type Price struct {
Version string `json:"version"`
Price float64 `json:"price"`
Unit string `json:"unit"`
}
/* 上面這種寫法,等於下面這樣
type Album struct {
Name string `json:"name"`
Singer string `json:"singer"`
ReleaseDate string `json:"releaseDate"`
Version string `json:"version"`
Price float64 `json:"price"`
Unit string `json:"unit"`
}
*/
宣告部分,改寫如下
album := Album{
Name: "KILL MY DOUBT",
Singer: "ITZY",
ReleaseDate: "2023-07-31",
Price: Price{
Version: "STANDARD",
Price: 13400,
Unit: "KRW",
},
}
輸出結果如下
{
"name": "KILL MY DOUBT",
"singer": "ITZY",
"releaseDate": "2023-07-31",
"version": "STANDARD",
"price": 13400,
"unit": "KRW"
}
這種抽離的用法我自己覺得會是偏向模組化的感覺
將一個大 struct 透過多個小 struct 來組成
維護上感覺也會比較方便?
此外也可以在結構中宣告型別為結構的成員,像是下面這樣
我們將 Price 改寫,改寫完的 struct 如下
type Album struct {
Name string `json:"name"`
Singer string `json:"singer"`
ReleaseDate string `json:"releaseDate"`
Prices []Price `json:"prices"`
}
type Price struct {
Version string `json:"version"`
Price float64 `json:"price"`
Unit string `json:"unit"`
}
宣告部分,改寫後如下
album := Album{
Name: "KILL MY DOUBT",
Singer: "ITZY",
ReleaseDate: "2023-07-31",
Prices: []Price{
{Version: "LIMITED", Price: 13400, Unit: "KRW"},
{Version: "STANDARD", Price: 13400, Unit: "KRW"},
{Version: "DIGIPACK", Price: 10400, Unit: "KRW"},
{Version: "CASSETTE", Price: 10400, Unit: "KRW"},
},
}
輸出結果如下
{
"name": "KILL MY DOUBT",
"singer": "ITZY",
"releaseDate": "2023-07-31",
"prices": [
{
"version": "LIMITED",
"price": 13400,
"unit": "KRW"
},
{
"version": "STANDARD",
"price": 13400,
"unit": "KRW"
},
{
"version": "DIGIPACK",
"price": 10400,
"unit": "KRW"
},
{
"version": "CASSETTE",
"price": 10400,
"unit": "KRW"
}
]
}
今天簡單介紹了 Go 的 struct 基本用法
用 Go 實作物件導向時,struct 會是一個重點
下一篇會來介紹 map 的用法
明天見~